<?php
/* vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 textwidth=150 number: */

/**
 * Classe ViagensController
 *
 * ...
 *
 * PHP versão 5
 *
 * LICENÇA: Este arquivo fonte esta sob o termos da licença MIT.
 *
 * @package   scuf.controller
 * @author    Rodrigo Casara <rodrigocasara@gmail.com>
 * @copyright 2012 Rodrigo Casara
 * @license   MIT License (http://www.opensource.org/licenses/mit-license.php)
 * @version   SVN: $Id$
 * @link
 * @since     SCUF(tm) v 1.0.0
 */

App::uses('AppController', 'Controller');

/**
 * Classe ViagensController
 *
 * {@inheritdoc}
 */
class ViagensController extends AppController {

  /**
   *
   */
  public $helpers = array('Number', 'Paginator', 'Time');

  /**
   * Opções de paginação.
   *
   * @var array
   */
  public $paginate = array(
    'fields' => array(
      'Viagem.id',
      'Viagem.data_partida',
      'Viagem.hora_partida',
      'MunicipioOrigem.nome',
      'EstadoOrigem.nome',
      'EstadoOrigem.sigla',
      'PaisOrigem.nome',
      'PaisOrigem.sigla',
      'MunicipioDestino.nome',
      'EstadoDestino.nome',
      'EstadoDestino.sigla',
      'PaisDestino.nome',
      'PaisDestino.sigla',
      'Veiculo.id',
      'Veiculo.descricao',
      'Viagem.assentos_disponiveis',
      'Viagem.preco',
    ),
    'joins' => array(
      array(
        'table' => 'municipios',
        'alias' => 'MunicipioOrigem',
        'type' => 'LEFT',
        'conditions' => array('Viagem.municipio_origem_id = MunicipioOrigem.id'),
      ),
      array(
        'table' => 'estados',
        'alias' => 'EstadoOrigem',
        'type' => 'LEFT',
        'conditions' => array('MunicipioOrigem.estado_id = EstadoOrigem.id'),
      ),
      array(
        'table' => 'paises',
        'alias' => 'PaisOrigem',
        'type' => 'LEFT',
        'conditions' => array('EstadoOrigem.pais_id = PaisOrigem.id'),
      ),
      array(
        'table' => 'municipios',
        'alias' => 'MunicipioDestino',
        'type' => 'LEFT',
        'conditions' => array('Viagem.municipio_destino_id = MunicipioDestino.id'),
      ),
      array(
        'table' => 'estados',
        'alias' => 'EstadoDestino',
        'type' => 'LEFT',
        'conditions' => array('MunicipioDestino.estado_id = EstadoDestino.id'),
      ),
      array(
        'table' => 'paises',
        'alias' => 'PaisDestino',
        'type' => 'LEFT',
        'conditions' => array('EstadoDestino.pais_id = PaisDestino.id'),
      ),
      array(
        'table' => 'veiculos',
        'alias' => 'Veiculo',
        'type' => 'LEFT',
        'conditions' => array('Viagem.veiculo_id = Veiculo.id'),
      ),
    ),
    'order' => array(
      'Viagem.data_partida' => 'desc',
      'Viagem.hora_partida' => 'desc',
      'MunicipioOrigem.nome' => 'asc',
      'EstadoOrigem.nome' => 'asc',
      'PaisOrigem.nome' => 'asc',
      'MunicipioDestino.nome' => 'asc',
      'EstadoOrigem.Destino' => 'asc',
      'PaisOrigem.Destino' => 'asc',
      'Viagem.assentos_disponiveis' => 'asc',
      'Viagem.preco' => 'asc',
    ),
    'limit' => 10,
    'page' => 1,
    'recursive' => -1
  );

  // Cake Callbacks {{{

  /**
   * (non-PHPdoc)
   * @see Controller::beforeFilter()
   */
  public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('ofertasDeCarona');
  }

  //}}}

  /**
   * Descreva o método aqui ...
   */
  public function index() {
    App::uses('CakeNumber', 'Utility');
    CakeNumber::addFormat('BRR', array(
      'before' => 'R$ ', 'after' => false, 'zero' => 0, 'places' => 2, 'thousands' => '.',
      'decimals' => ',', 'negative' => '-', 'escape' => true)
    );
    $this->paginate['conditions'] = array('Viagem.motorista_pessoa_id = ' . $this->Auth->user('id')); // Somente as viagens do motorista.
    $this->set('viagens', $this->paginate());
    $this->set('temVeiculo', $this->Viagem->temVeiculo());
  }

  public function adicionar() {
    if ($this->Viagem->temVeiculo()) {
      if ($this->request->is('post')) {
        if ($this->RequestHandler->isAjax()) {
          $this->autoRender = false;
          $resposta = array(
            'mensagem' => '',
            'sucesso' => false,
            'campos' => array(),
          );
          //
          $this->Viagem->begin();
          if ($this->Viagem->save($this->request->data)) {
            $this->Viagem->commit();
            $resposta['mensagem'] = 'O cadastro de sua viagem foi realizado com sucesso.';
            $resposta['sucesso'] = true;
          } else {
            $this->Viagem->rollback();
            if (!empty($this->Viagem->validationErrors)) {
              $resposta['mensagem'] = 'Há campos obrigatórios que não foram preenchidos ou o valor informado é inválido.';
              $resposta['campos'] = $this->Viagem->validationErrors;
              // Formata array com as mensagens de validação dos campos com erro. {{{
              $campos = array();
              $valores = array();
              foreach ($resposta['campos'] as $campo => $valor) {
                array_push($campos, "data[{$this->Viagem->alias}][{$campo}]");
                array_push($valores, $valor[0]);
              }
              //}}}
              $resposta['campos'] = array_combine($campos, $valores);
            } else {
              $resposta['mensagem'] = 'Não foi possível salvar os dados da viagem.';
            }
          }
          echo json_encode($resposta);
        } else {
          throw new BadRequestException();
        }
      }
    } else {
      $this->Session->setFlash(
        'Para cadastrar uma viagem é necessário possuir pelo menos um veículo.',
        'mensagens', array('titulo' => 'Aviso', 'tipo' => 'notice')
      );
      $this->redirect(array('controller' => 'veiculos', 'action' => 'adicionar'));
    }
    //
    $this->set('veiculos', $this->Viagem->Veiculo->find(
      'all', array('conditions' => 'pessoa_id = ' . $this->Auth->user('id'), 'recursive' => -1)
    ));
  }

  public function editar($id = null) {
    $this->Viagem->id = $id;
    if (!$this->Viagem->temPedidoDeCarona()) {
      if ($this->request->is('get')) {
        $this->set('viagem', $this->Viagem->read());
        $this->set('veiculos', $this->Viagem->Veiculo->find(
          'all', array('conditions' => 'pessoa_id = ' . $this->Auth->user('id'), 'recursive' => -1)
        ));
      } elseif ($this->request->is('post')) {
        if ($this->RequestHandler->isAjax()) {
          $this->autoRender = false;
          $resposta = array(
            'mensagem' => '',
            'sucesso' => false,
            'campos' => array(),
          );
          //
          $this->Viagem->begin();
          if ($this->Viagem->save($this->request->data)) {
            $this->Viagem->commit();
            $resposta['mensagem'] = 'O cadastro de sua viagem foi alterado com sucesso.';
            $resposta['sucesso'] = true;
          } else {
            $this->Viagem->rollback();
            if (!empty($this->Viagem->validationErrors)) {
              $resposta['mensagem'] = 'Há campos obrigatórios que não foram preenchidos ou o valor informado é inválido.';
              $resposta['campos'] = $this->Viagem->validationErrors;
              // Formata array com as mensagens de validação dos campos com erro. {{{
              $campos = array();
              $valores = array();
              foreach ($resposta['campos'] as $campo => $valor) {
                array_push($campos, "data[{$this->Viagem->alias}][{$campo}]");
                array_push($valores, $valor[0]);
              }
              //}}}
              $resposta['campos'] = array_combine($campos, $valores);
            } else {
              $resposta['mensagem'] = 'Não foi possível alterar os dados da viagem.';
            }
          }
          echo json_encode($resposta);
        } else {
          throw new BadRequestException();
        }
      }
    } else {
      $this->Session->setFlash(
        'Não é possível alterar os dados da viagem, pois ela já possue pedidos de carona.',
        'mensagens', array('titulo' => 'Aviso', 'tipo' => 'notice')
      );
      // TODO: redirecionamento deve ser feito com javascript (Backbone Router).
      $this->redirect(array('controller' => 'viagens', 'action' => 'index'));
    }
  }

  /**
   * Excluir viagem.
   * @param integer $id Identificador da viagem.
   * @throws MethodNotAllowedException
   * @throws NotFoundException
   * @throws BadRequestException
   */
  public function excluir($id) {
    if (!$this->request->is('delete')) {
      throw new MethodNotAllowedException();
    }
    //
    $this->Viagem->id = $id;
    if (!$this->Viagem->exists()) {
      throw new NotFoundException('Viagem não encontrada.');
    }
    //
    if ($this->RequestHandler->isAjax()) {
      $this->autoRender = false;
      $resposta = array(
        'mensagem' => '',
        'sucesso' => false,
      );
      if (!$this->Viagem->temPedidoDeCarona()) {
        $this->Viagem->begin();
        if ($this->Viagem->delete()) {
          $this->Viagem->commit();
          $resposta['mensagem'] = 'Viagem excluída com sucesso.';
          $resposta['sucesso'] = true;
        } else {
          $this->Viagem->rollback();
          $resposta['mensagem'] = 'Não foi possível excluir a viagem.';
        }
      } else {
        $resposta['mensagem'] = 'Não é possível excluir esta viagem, pois ela já possue pedidos de carona.';
        $resposta['sucesso'] = false;
        $this->response->statusCode(500);
        $this->response->send();
        echo $resposta['mensagem'];
        return;
      }
      echo json_encode($resposta);
    } else {
      throw new BadRequestException();
    }
  }

  public function ofertasDeCarona() {
    $this->autoRender = false;
    // Campos {{{
    $this->paginate['fields'] = array(
      'Viagem.id',
      'Viagem.data_partida',
      'Viagem.hora_partida',
      'MunicipioOrigem.nome',
      'MunicipioDestino.nome',
      'Viagem.assentos_disponiveis',
    );
    //}}}
    // Filtros {{{
    //$this->paginate['conditions'] $this->postConditions($this->request->data, array('nome' => 'LIKE')); // postConditions não coloca %% para ILIKE
    if (isset($this->request->query['data'])) {
      $dados = &$this->request->query['data'];
      if ($dados['Viagem']['data_partida']) {
        $this->paginate['conditions']['Viagem.data_partida'] = $dados['Viagem']['data_partida'];
      }
      if ($dados['Viagem']['hora_partida']) {
        $this->paginate['conditions']['Viagem.hora_partida'] = $dados['Viagem']['hora_partida'];
      }
      if ($dados['MunicipioOrigem']['nome']) {
        $this->paginate['conditions']['MunicipioOrigem.nome ILIKE'] = '%' . $dados['MunicipioOrigem']['nome'] . '%';
      }
      if ($dados['MunicipioDestino']['nome']) {
        $this->paginate['conditions']['MunicipioDestino.nome ILIKE'] = '%' . $dados['MunicipioDestino']['nome'] . '%';
      }
      if ($dados['Viagem']['assentos_disponiveis']) {
        $this->paginate['conditions']['Viagem.assentos_disponiveis'] = $dados['Viagem']['assentos_disponiveis'];
      }
    }
    //}}}
    $ofertas = $this->paginate();
    $oferta = reset($ofertas);
    while ($oferta !== false) {
      $chave = key($ofertas);
      $ofertas[$chave] = array(
        'id' => $oferta['Viagem']['id'],
        'dataPartida' => $oferta['Viagem']['data_partida'],
        'horaPartida' => $oferta['Viagem']['hora_partida'],
        'origem' => $oferta['MunicipioOrigem']['nome'],
        'destino' => $oferta['MunicipioDestino']['nome'],
        'assentosDisponiveis' => $oferta['Viagem']['assentos_disponiveis']
      );
      $oferta = next($ofertas);
    }
    echo json_encode($ofertas);
  }

  public function pedirCarona($id = null) {
    $this->Viagem->id = $id;
    $this->set('viagem', $this->Viagem->read());
/*
    array(
      'Viagem' => array('id' => 5,
                        'municipio_origem_id' => 5044,
                        'municipio_destino_id' => 4984,
                        'motorista_pessoa_id' => 4,
                        'veiculo_id' => 16,
                        'data_partida' => '2012-06-05',
                        'hora_partida' => '13:15:05',
                        'assentos_disponiveis' => 4,
                        'preco' => '52.25',
                        'observacao' => ''),
      'MunicipioOrigem' => array ('id' => 5044,
                                  'estado_id' => 43,
                                  'nome' => 'Taquara'),
      'MunicipioDestino' => array ('id' => 4984,
                                   'estado_id' => 43,
                                   'nome' => 'São Borja'),
      'MotoristaPessoa' => array ('id' => 4,
                                  'nome' => 'Querte',
                                  'sexo' => 'F',
                                  'data_nascimento' => '1856-01-01',
                                  'email' => 'querte@faccat.br',
                                  'senha' => '7c4a8d09ca3762af61e59520943dc26494f8941b',
                                  'municipio_id' => 5044,
                                  'telefone_residencial' => '',
                                  'telefone_celular' => '',
                                  'fumante' => true,
                                  'qualificacoes_positivas' => 0,
                                  'qualificacoes_negativas' => 0,
                                  'fotografia' => NULL),
      'Veiculo' => array ('id' => 16,
                          'pessoa_id' => 4,
                          'descricao' => 'Voyage',
                          'placa' => 'QTY2888',
                          'ano' => 2012,
                          'capacidade' => 5,
                          'cor' => 'preta',
                          'fotografia' => NULL,
                          'descricao_detalhada' => 'Voyage - 2012 - cor preta'),
      'Carona' => array (),
    )

    {
      "Viagem": {
        "id": 5,
        "municipio_origem_id": 5044,
        "municipio_destino_id": 4984,
        "motorista_pessoa_id": 4,
        "veiculo_id": 16,
        "data_partida": "2012-06-05",
        "hora_partida": "13:15:05",
        "assentos_disponiveis": 4,
        "preco": "52.25",
        "observacao": ""
      },
      "MunicipioOrigem": {
        "id": 5044,
        "estado_id": 43,
        "nome": "Taquara"
      },
      "MunicipioDestino": {
        "id": 4984,
        "estado_id": 43,
        "nome": "S\u00e3o Borja"
      },
      "MotoristaPessoa": {
        "id": 4,
        "nome": "Querte",
        "sexo": "F",
        "data_nascimento": "1856-01-01",
        "email": "querte@faccat.br",
        "senha": "7c4a8d09ca3762af61e59520943dc26494f8941b",
        "municipio_id": 5044,
        "telefone_residencial": "",
        "telefone_celular": "",
        "fumante": true,
        "qualificacoes_positivas": 0,
        "qualificacoes_negativas": 0,
        "fotografia": null
      },
      "Veiculo": {
        "id": 16,
        "pessoa_id": 4,
        "descricao": "Voyage",
        "placa": "QTY2888",
        "ano": 2012,
        "capacidade": 5,
        "cor": "preta",
        "fotografia": null,
        "descricao_detalhada": "Voyage - 2012 - cor preta"
      },
      "Carona": []
    }
*/
  }

}

?>